﻿using System;
using sorTV.Model;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Data.SqlClient;
using System.Data;
using System.Xml;
using System.Data.SqlTypes;
using System.IO;
using sorTV.Interface;

namespace sorTV.Controller
{
    /// <summary>
    /// Lavet af Rasmus, Ole og Søren - Styrer alt kontakt med databasen.
    /// </summary>
    public class DBController
    {
        #region Fields
        private static int _xmlID = 1;
        private const string CONNECTIONSTRING = "SERVER=ealdb1.eal.local;INITIAL CATALOG=ejl08_db;USER=ejl08_usr; PASSWORD=Baz1nga8; MultipleActiveResultSets=True";
        SqlConnection _sqlCon1; //0Kørsel
        SqlConnection _sqlCon2; // XMLSP
        SqlConnection _sqlCon3; // ValgSP
        SqlConnection _sqlCon4; // Manuel SP
        SqlConnection _sqlCon5; // Resultater
        #endregion

        public DBController()
        {
            _sqlCon1 = new SqlConnection();
            _sqlCon2 = new SqlConnection();
            _sqlCon3 = new SqlConnection();
            _sqlCon4 = new SqlConnection();
            _sqlCon5 = new SqlConnection();
        }

        #region Connection Metoder
        /// <summary>
        /// 
        /// </summary>
        /// <param name="connection">
        /// <para>0: 0Kørsel</para>
        /// <para>1: XML SP</para>
        /// <para>2: Valg SP</para>
        /// <para>3: Manuel SP</para>
        /// <para>4: Resultater</para>
        /// </param>
        /// <returns></returns>
        public SqlConnection OpenConnection(int connection)
        {
            SqlConnection retVal = null; 
            switch (connection)
            {
                case 0:
                    _sqlCon1.ConnectionString = CONNECTIONSTRING;
                    _sqlCon1.Open();
                    retVal = _sqlCon1;
                    break;
                case 1:
                    _sqlCon2.ConnectionString = CONNECTIONSTRING;
                    _sqlCon2.Open();
                    retVal = _sqlCon2;
                    break;
                case 2:
                    _sqlCon3.ConnectionString = CONNECTIONSTRING;
                    _sqlCon3.Open();
                    retVal = _sqlCon3;
                    break;
                case 3:
                    _sqlCon4.ConnectionString = CONNECTIONSTRING;
                    _sqlCon4.Open();
                    retVal = _sqlCon4;
                    break;
                case 4:
                    _sqlCon5.ConnectionString = CONNECTIONSTRING;
                    _sqlCon5.Open();
                    retVal = _sqlCon5;
                    break;
            }

            return retVal;
        }
        public void CloseConnection(int connection)
        {
            switch (connection)
            {
                case 0:
                    _sqlCon1.Close();
                    break;
                case 1:
                    _sqlCon2.Close();
                    break;
                case 2:
                    _sqlCon3.Close();
                    break;
                case 3:
                    _sqlCon4.Close();
                    break;
                case 4:
                    _sqlCon5.Close();
                    break;
            }
        } 
        #endregion

        #region 0-Kørsel

        /// <summary>
        /// Lavet af Rasmus - Bruges til at 0-køre GeoAmtStorkreds i databasen
        /// </summary>
        /// <param name="amtstorkreds"></param>
        /// <param name="sqlCon"></param>
        public void SPF1_0Kørsel_GeoAmtstorkreds(GeoAmtstorkreds amtstorkreds,SqlConnection sqlCon)
        {
            SqlCommand sqlComm = new SqlCommand();
            sqlComm.Connection = sqlCon;
            sqlComm.CommandType = CommandType.StoredProcedure;
            sqlComm.CommandText = "SPF1_0Kørsel_GeoAmtStorKreds";

            SqlParameter par = new SqlParameter("@GAID", SqlDbType.Int);
            par.Value = amtstorkreds.AmtstorkredsID;
            sqlComm.Parameters.Add(par);

            par = new SqlParameter("@NavnGA", SqlDbType.NVarChar);
            par.Value = amtstorkreds.Navn;
            sqlComm.Parameters.Add(par);

            sqlComm.ExecuteNonQuery();
        }

        /// <summary>
        /// Lavet af Rasmus - Bruges til at 0-køre GeoValgKreds i databasen
        /// </summary>
        /// <param name="valgkreds"></param>
        /// <param name="sqlCon"></param>
        public void SPF1_0Kørsel_GeoValgkreds(GeoValgKreds valgkreds, SqlConnection sqlCon)
        {
            SqlCommand sqlComm = new SqlCommand();
            sqlComm.Connection = sqlCon;
            sqlComm.CommandType = CommandType.StoredProcedure;
            sqlComm.CommandText = "SPF1_0Kørsel_GeoValgkreds";

            SqlParameter par = new SqlParameter("@GVID", SqlDbType.Int);
            par.Value = valgkreds.ValgKredsID;
            sqlComm.Parameters.Add(par);

            par = new SqlParameter("@NavnGV", SqlDbType.NVarChar);
            par.Value = valgkreds.Navn;
            sqlComm.Parameters.Add(par);

            sqlComm.ExecuteNonQuery();
        }

        /// <summary>
        /// Lavet af Rasmus - Bruges til at 0-køre kommune i databasen
        /// </summary>
        /// <param name="kommune"></param>
        /// <param name="sqlCon"></param>
        public void SPF1_0Kørsel_GeoKommune(GeoKommune kommune, SqlConnection sqlCon)
        {
            SqlCommand sqlComm = new SqlCommand();
            sqlComm.Connection = sqlCon;
            sqlComm.CommandType = CommandType.StoredProcedure;
            sqlComm.CommandText = "SPF1_0Kørsel_GeoKommune";

            SqlParameter par = new SqlParameter("@GKID", SqlDbType.Int);
            par.Value = kommune.KommuneID;
            sqlComm.Parameters.Add(par);

            par = new SqlParameter("@NavnGK", SqlDbType.NVarChar);
            par.Value = kommune.Navn;
            sqlComm.Parameters.Add(par);

            sqlComm.ExecuteNonQuery();
        }

        /// <summary>
        /// Lavet af Rasmus - Bruges til at 0-køre distrikter (afstemningsområder) i databasen
        /// </summary>
        /// <param name="distrikt"></param>
        /// <param name="sqlCon"></param>
        public void SPF1_0Kørsel_GeoDistrikt(GeoDistrikt distrikt, SqlConnection sqlCon)
        {
            SqlCommand sqlComm = new SqlCommand();
            sqlComm.Connection = sqlCon;
            sqlComm.CommandType = CommandType.StoredProcedure;
            sqlComm.CommandText = "SPF1_0Kørsel_GeoDistrikt";

            SqlParameter par = new SqlParameter("@StedID", SqlDbType.Int);
            par.Value = distrikt.DistriktID;
            sqlComm.Parameters.Add(par);

            par = new SqlParameter("@NavnGD", SqlDbType.NVarChar);
            par.Value = distrikt.Navn;
            sqlComm.Parameters.Add(par);

            par = new SqlParameter("@AdresseLinje1", SqlDbType.NVarChar);
            par.Value = distrikt.AdresseLinje1;
            sqlComm.Parameters.Add(par);


            par = new SqlParameter("@AdresseLinje2", SqlDbType.NVarChar);
            par.Value = distrikt.AdresseLinje2;
            sqlComm.Parameters.Add(par);


            par = new SqlParameter("@AdresseLinje3", SqlDbType.NVarChar);
            par.Value = distrikt.AdresseLinje3;
            sqlComm.Parameters.Add(par);


            par = new SqlParameter("@GKID", SqlDbType.Int);
            par.Value = distrikt.KommuneID;
            sqlComm.Parameters.Add(par);

            sqlComm.ExecuteNonQuery();
        } 
        #endregion

        #region XML SP
        /// <summary>
        /// Lavet af Rasmus - Nulstiller XMLs i databasen.
        /// </summary>
        /// <param name="sqlCon"></param>
        public void SP_XML_Nulstil(SqlConnection sqlCon)
        {
            SqlCommand sqlComm = new SqlCommand();
            sqlComm.Connection = sqlCon;
            sqlComm.CommandType = CommandType.StoredProcedure;
            sqlComm.CommandText = "SP_XML_Nulstil";

            sqlComm.ExecuteNonQuery();
        }

        /// <summary>
        /// Lavet af Rasmus - Lægger et XML dokument i databasen.
        /// </summary>
        /// <param name="doc"></param>
        /// <param name="filnavn"></param>
        /// <param name="sqlCon"></param>
        public void SP_XML_Insert(XmlDocument doc,string filnavn, SqlConnection sqlCon)
        {
            SqlCommand sqlComm = new SqlCommand();
            sqlComm.Connection = sqlCon;
            sqlComm.CommandType = CommandType.StoredProcedure;
            sqlComm.CommandText = "SP_XML_Insert";

            SqlParameter par = new SqlParameter("@XmlFil", SqlDbType.Xml);
            par.Value = new SqlXml(XmlReader.Create(new StringReader(doc.OuterXml)));
            sqlComm.Parameters.Add(par);

            par = new SqlParameter("@filnavn", SqlDbType.NVarChar);
            par.Value = filnavn;
            sqlComm.Parameters.Add(par);

            sqlComm.ExecuteNonQuery();
        }

        /// <summary>
        /// Lavet af Rasmus - Henter XML fra databasen
        /// </summary>
        /// <param name="sqlCon"></param>
        /// <returns></returns>
        public Dictionary<XmlDocument,string> SP_XML_Hent(SqlConnection sqlCon)
        {
            Dictionary<XmlDocument, string> retVal = new Dictionary<XmlDocument, string>();
            SqlCommand sqlComm = new SqlCommand();
            sqlComm.CommandType = CommandType.StoredProcedure;
            sqlComm.CommandText = "SP_XML_Hent";
            sqlComm.Connection = sqlCon;

            SqlParameter par = new SqlParameter("@ID", SqlDbType.Int);
            par.Value = _xmlID;
            sqlComm.Parameters.Add(par);

            par = new SqlParameter("@xmlfil", SqlDbType.Xml);
            par.Direction = ParameterDirection.Output;
            sqlComm.Parameters.Add(par);

            par = new SqlParameter("@filnavn", SqlDbType.NVarChar, 150);
            par.Direction = ParameterDirection.Output;
            sqlComm.Parameters.Add(par);
            XmlDocument doc = new XmlDocument();
            sqlComm.ExecuteNonQuery();
            try
            {
                doc.LoadXml(sqlComm.Parameters["@xmlfil"].Value.ToString());

            }
            catch (Exception)
            {
                _xmlID++;
                SP_XML_Hent(sqlCon);
            }
                

                string filnavn = sqlComm.Parameters["@filnavn"].Value.ToString();
                _xmlID++;
                retVal.Add(doc, filnavn);
            
           
            return retVal;
        } 
        #endregion

        #region Valg SP

        /// <summary>
        /// Lavet af Søren - lægger valgdata fra afstemningsområde i databasen, tager højde for hvilken fase 
        /// og lægger ud fra det det rigtige data i databasen.
        /// </summary>
        /// <param name="ao"></param>
        /// <param name="sqlCon"></param>
        /// <param name="valgnummer"></param>
        private void SP_Afstemningsområde(Afstemningsområde ao, SqlConnection sqlCon, int valgnummer)
        {
            SqlCommand command = new SqlCommand("SP_Afstemningsområde", sqlCon);
            command.CommandType = CommandType.StoredProcedure;
            SqlParameter parameter;

            parameter = new SqlParameter("@valgnummer", SqlDbType.Int);
            parameter.Value = valgnummer;
            command.Parameters.Add(parameter);

            parameter = new SqlParameter("@GVID", SqlDbType.Int);
            parameter.Value = ao.KredsID;
            command.Parameters.Add(parameter);

            parameter = new SqlParameter("@GAID", SqlDbType.Int);
            parameter.Value = ao.AmtstorkredsID;
            command.Parameters.Add(parameter);

            parameter = new SqlParameter("@GKID", SqlDbType.Int);
            parameter.Value = ao.KommuneID;
            command.Parameters.Add(parameter);

            parameter = new SqlParameter("@StedID", SqlDbType.Int);
            parameter.Value = ao.StedID;
            command.Parameters.Add(parameter);

            parameter = new SqlParameter("@ValgArt", SqlDbType.Char);
            parameter.Value = ao.Valgart;
            command.Parameters.Add(parameter);

            parameter = new SqlParameter("@ValgType", SqlDbType.NVarChar);
            parameter.Value = ao.Type;
            command.Parameters.Add(parameter);

            parameter = new SqlParameter("@Valgfase", SqlDbType.Int);
            parameter.Value = ao.Valgfase;
            command.Parameters.Add(parameter);

            parameter = new SqlParameter("@TimeStamp", SqlDbType.DateTime);
            parameter.Value = ao.Timestamp;
            command.Parameters.Add(parameter);

            parameter = new SqlParameter("@StemmeProcent", SqlDbType.Decimal);
            parameter.Value = ao.Stemme.Stemmeprocent;
            command.Parameters.Add(parameter);

            parameter = new SqlParameter("@ForrigeProcent", SqlDbType.Decimal);
            parameter.Value = ao.Stemme.ForrigeProcent;
            command.Parameters.Add(parameter);

            parameter = new SqlParameter("@StemmeBerettigede", SqlDbType.Int);
            parameter.Value = ao.Stemme.Stemmeberettigede;
            command.Parameters.Add(parameter);

            parameter = new SqlParameter("@Ugyldige", SqlDbType.Int);
            parameter.Value = ao.Stemme.Ugyldige;
            command.Parameters.Add(parameter);

            parameter = new SqlParameter("@ForrigeUgyldige", SqlDbType.Int);
            parameter.Value = ao.Stemme.ForrigeUgyldige;
            command.Parameters.Add(parameter);

            parameter = new SqlParameter("@Blanke", SqlDbType.Int);
            parameter.Value = ao.Stemme.Blanke;
            command.Parameters.Add(parameter);

            parameter = new SqlParameter("@ForrigeBlanke", SqlDbType.Int);
            parameter.Value = ao.Stemme.ForrigeBlanke;
            command.Parameters.Add(parameter);

            parameter = new SqlParameter("@ForrigeRest", SqlDbType.Int);
            parameter.Value = ao.Stemme.ForrigeRest;
            command.Parameters.Add(parameter);

            parameter = new SqlParameter("@IaltAfgivet", SqlDbType.Int);
            parameter.Value = ao.Stemme.IAltAfgivet;
            command.Parameters.Add(parameter);

            command.ExecuteNonQuery();

            foreach (var lister in ao.Stemme.Lister)
            {
                int? listeid = SPListe(lister, ao,sqlCon,valgnummer);

                if (ao.Valgfase == 4)
                {
                    foreach (var kandidat in lister.Kandidater)
                    {
                        SPKandidat(kandidat, ao.Type, listeid, sqlCon,valgnummer);
                    }
                }
            }
        }

        /// <summary>
        /// Lavet af Søren - lægger valgdata fra kommune i databasen, tager højde for hvilken fase 
        /// og lægger ud fra det det rigtige data i databasen.
        /// </summary>
        /// <param name="kom"></param>
        /// <param name="sqlCon"></param>
        /// <param name="valgnummer"></param>
        private void SP_Kommune(Kommune kom, SqlConnection sqlCon, int valgnummer)
        {
            SqlCommand command = new SqlCommand("SP_Kommune", sqlCon);
            command.CommandType = CommandType.StoredProcedure;
            SqlParameter parameter;

            parameter = new SqlParameter("@valgnummer", SqlDbType.Int);
            parameter.Value = valgnummer;
            command.Parameters.Add(parameter);

            parameter = new SqlParameter("@GKID", SqlDbType.Int);
            parameter.Value = kom.KommuneID;
            command.Parameters.Add(parameter);

            parameter = new SqlParameter("@GAID", SqlDbType.Int);
            parameter.Value = kom.AmtstorkredsID;
            command.Parameters.Add(parameter);

            parameter = new SqlParameter("@ValgArt", SqlDbType.Char);
            parameter.Value = kom.Valgart;
            command.Parameters.Add(parameter);

            parameter = new SqlParameter("@Valgfase", SqlDbType.Int);
            parameter.Value = kom.Valgfase;
            command.Parameters.Add(parameter);

            parameter = new SqlParameter("@ValgType", SqlDbType.NVarChar);
            parameter.Value = kom.Type;
            command.Parameters.Add(parameter);

            parameter = new SqlParameter("@TimeStamp", SqlDbType.DateTime);
            parameter.Value = kom.Timestamp;
            command.Parameters.Add(parameter);

            parameter = new SqlParameter("@StemmeProcent", SqlDbType.Decimal);
            parameter.Value = kom.Stemme.Stemmeprocent;
            command.Parameters.Add(parameter);

            parameter = new SqlParameter("@ForrigeProcent", SqlDbType.Decimal);
            parameter.Value = kom.Stemme.ForrigeProcent;
            command.Parameters.Add(parameter);

            parameter = new SqlParameter("@StemmeBerettigede", SqlDbType.Int);
            parameter.Value = kom.Stemme.Stemmeberettigede;
            command.Parameters.Add(parameter);

            parameter = new SqlParameter("@Ugyldige", SqlDbType.Int);
            parameter.Value = kom.Stemme.Ugyldige;
            command.Parameters.Add(parameter);

            parameter = new SqlParameter("@ForrigeUgyldige", SqlDbType.Int);
            parameter.Value = kom.Stemme.ForrigeUgyldige;
            command.Parameters.Add(parameter);

            parameter = new SqlParameter("@Blanke", SqlDbType.Int);
            parameter.Value = kom.Stemme.Blanke;
            command.Parameters.Add(parameter);

            parameter = new SqlParameter("@ForrigeBlanke", SqlDbType.Int);
            parameter.Value = kom.Stemme.ForrigeBlanke;
            command.Parameters.Add(parameter);

            parameter = new SqlParameter("@ForrigeRest", SqlDbType.Int);
            parameter.Value = kom.Stemme.ForrigeRest;
            command.Parameters.Add(parameter);

            parameter = new SqlParameter("@IaltAfgivet", SqlDbType.Int);
            parameter.Value = kom.Stemme.IAltAfgivet;
            command.Parameters.Add(parameter);

            command.ExecuteNonQuery();

            foreach (var lister in kom.Stemme.Lister)
            {
                int? listeid = SPListe(lister, kom, sqlCon,valgnummer);

                if (kom.Valgfase == 4)
                {
                    foreach (var kandidat in lister.Kandidater)
                    {
                        SPKandidat(kandidat, kom.Type, listeid, sqlCon,valgnummer);
                    }
                }

            }
        }

        /// <summary>
        /// Lavet af Søren - lægger valgdata fra kreds i databasen, tager højde for hvilken fase 
        /// og lægger ud fra det det rigtige data i databasen.
        /// </summary>
        /// <param name="kreds"></param>
        /// <param name="sqlCon"></param>
        /// <param name="valgnummer"></param>
        private void SP_Kreds(Kreds kreds, SqlConnection sqlCon, int valgnummer)
        {
            SqlCommand command = new SqlCommand("SP_Kreds", sqlCon);
            command.CommandType = CommandType.StoredProcedure;
            SqlParameter parameter;

            parameter = new SqlParameter("@valgnummer", SqlDbType.Int);
            parameter.Value = valgnummer;
            command.Parameters.Add(parameter);

            parameter = new SqlParameter("@GVID", SqlDbType.Int);
            parameter.Value = kreds.KredsID;
            command.Parameters.Add(parameter);

            parameter = new SqlParameter("@GAID", SqlDbType.Int);
            parameter.Value = kreds.AmtstorkredsID;
            command.Parameters.Add(parameter);

            parameter = new SqlParameter("@ValgArt", SqlDbType.Char);
            parameter.Value = kreds.Valgart;
            command.Parameters.Add(parameter);

            parameter = new SqlParameter("@ValgType", SqlDbType.NVarChar);
            parameter.Value = kreds.Type;
            command.Parameters.Add(parameter);

            parameter = new SqlParameter("@Valgfase", SqlDbType.Int);
            parameter.Value = kreds.Valgfase;
            command.Parameters.Add(parameter);

            parameter = new SqlParameter("@TimeStamp", SqlDbType.DateTime);
            parameter.Value = kreds.Timestamp;
            command.Parameters.Add(parameter);

            parameter = new SqlParameter("@StemmeProcent", SqlDbType.Decimal);
            parameter.Value = kreds.Stemme.Stemmeprocent;
            command.Parameters.Add(parameter);

            parameter = new SqlParameter("@ForrigeProcent", SqlDbType.Decimal);
            parameter.Value = kreds.Stemme.ForrigeProcent;
            command.Parameters.Add(parameter);

            parameter = new SqlParameter("@StemmeBerettigede", SqlDbType.Int);
            parameter.Value = kreds.Stemme.Stemmeberettigede;
            command.Parameters.Add(parameter);

            parameter = new SqlParameter("@Ugyldige", SqlDbType.Int);
            parameter.Value = kreds.Stemme.Ugyldige;
            command.Parameters.Add(parameter);

            parameter = new SqlParameter("@ForrigeUgyldige", SqlDbType.Int);
            parameter.Value = kreds.Stemme.ForrigeUgyldige;
            command.Parameters.Add(parameter);

            parameter = new SqlParameter("@Blanke", SqlDbType.Int);
            parameter.Value = kreds.Stemme.Blanke;
            command.Parameters.Add(parameter);

            parameter = new SqlParameter("@ForrigeBlanke", SqlDbType.Int);
            parameter.Value = kreds.Stemme.ForrigeBlanke;
            command.Parameters.Add(parameter);

            parameter = new SqlParameter("@ForrigeRest", SqlDbType.Int);
            parameter.Value = kreds.Stemme.ForrigeRest;
            command.Parameters.Add(parameter);

            parameter = new SqlParameter("@IaltAfgivet", SqlDbType.Int);
            parameter.Value = kreds.Stemme.IAltAfgivet;
            command.Parameters.Add(parameter);

            command.ExecuteNonQuery();

            foreach (var lister in kreds.Stemme.Lister)
            {
                int? listeid = SPListe(lister, kreds, sqlCon,valgnummer);
                if (kreds.Valgfase == 4)
                {
                    foreach (var kandidat in lister.Kandidater)
                    {
                        SPKandidat(kandidat, kreds.Type, listeid, sqlCon,valgnummer);
                    }
                }
            }
        }

        /// <summary>
        /// Lavet af Søren - lægger en liste (et parti) i databasen, tager højde for hvilken valgtype det er fra 
        /// og lægger ud fra det det rigtige data i databasen.
        /// </summary>
        /// <param name="liste"></param>
        /// <param name="input"></param>
        /// <param name="sqlCon"></param>
        /// <param name="valgnummer"></param>
        /// <returns></returns>
        private int? SPListe(IListe liste, Valgdata input, SqlConnection sqlCon, int valgnummer)
        {
            SqlCommand command = null;
            SqlParameter parameter;
            int? listeid = null;

            switch (input.Type)
            {
                case "kommune":

                    command = new SqlCommand("SP_KomListe", sqlCon);
                    command.CommandType = CommandType.StoredProcedure;
                    Kommune kom = (Kommune)input;

                    command.Parameters.Clear();

                    parameter = new SqlParameter("@GAID", SqlDbType.Int);
                    parameter.Value = kom.AmtstorkredsID;
                    command.Parameters.Add(parameter);

                    parameter = new SqlParameter("@GKID", SqlDbType.Int);
                    parameter.Value = kom.KommuneID;
                    command.Parameters.Add(parameter);

                    parameter = new SqlParameter("@Valgfase", SqlDbType.Int);
                    parameter.Value = kom.Valgfase;
                    command.Parameters.Add(parameter);

                    parameter = new SqlParameter("@Bogstav", SqlDbType.NVarChar);
                    parameter.Value = liste.Bogstav;
                    command.Parameters.Add(parameter);

                    parameter = new SqlParameter("@Navn", SqlDbType.NVarChar);
                    parameter.Value = liste.Navn;
                    command.Parameters.Add(parameter);

                    parameter = new SqlParameter("@Stemmetal", SqlDbType.Int);
                    parameter.Value = liste.Stemmetal;
                    command.Parameters.Add(parameter);

                    parameter = new SqlParameter("@Procent", SqlDbType.Decimal);
                    parameter.Value = liste.Procent;
                    command.Parameters.Add(parameter);

                    parameter = new SqlParameter("@ForrigeStemmetal", SqlDbType.Int);
                    parameter.Value = liste.ForrigeStemmeTal;
                    command.Parameters.Add(parameter);

                    parameter = new SqlParameter("@ForrigeProcent", SqlDbType.Decimal);
                    parameter.Value = liste.ForrigeProcent;
                    command.Parameters.Add(parameter);

                    parameter = new SqlParameter("@Listestemmer", SqlDbType.Int);
                    parameter.Value = liste.ListeStemmer;
                    command.Parameters.Add(parameter);

                    parameter = new SqlParameter("@ListeID", SqlDbType.Int);
                    parameter.Direction = ParameterDirection.Output;
                    command.Parameters.Add(parameter);

                    parameter = new SqlParameter("@valgnummer", SqlDbType.Int);
                    parameter.Value = valgnummer;
                    command.Parameters.Add(parameter);



                    command.ExecuteNonQuery();
                    listeid = (int)command.Parameters["@ListeID"].Value;
                    break;

                case "afstemningsområde":
                    command = new SqlCommand("SP_AOListe", sqlCon);

                    command.CommandType = CommandType.StoredProcedure;
                    Afstemningsområde ao = (Afstemningsområde)input;

                    command.Parameters.Clear();

                    parameter = new SqlParameter("@GAID", SqlDbType.Int);
                    parameter.Value = ao.AmtstorkredsID;
                    command.Parameters.Add(parameter);

                    parameter = new SqlParameter("@GKID", SqlDbType.Int);
                    parameter.Value = ao.KommuneID;
                    command.Parameters.Add(parameter);

                    parameter = new SqlParameter("@GVID", SqlDbType.Int);
                    parameter.Value = ao.KredsID;
                    command.Parameters.Add(parameter);

                    parameter = new SqlParameter("@StedID", SqlDbType.Int);
                    parameter.Value = ao.StedID;
                    command.Parameters.Add(parameter);

                    parameter = new SqlParameter("@Valgfase", SqlDbType.Int);
                    parameter.Value = ao.Valgfase;
                    command.Parameters.Add(parameter);

                    parameter = new SqlParameter("@Bogstav", SqlDbType.NVarChar);
                    parameter.Value = liste.Bogstav;
                    command.Parameters.Add(parameter);

                    parameter = new SqlParameter("@Navn", SqlDbType.NVarChar);
                    parameter.Value = liste.Navn;
                    command.Parameters.Add(parameter);

                    parameter = new SqlParameter("@Stemmetal", SqlDbType.Int);
                    parameter.Value = liste.Stemmetal;
                    command.Parameters.Add(parameter);

                    parameter = new SqlParameter("@Procent", SqlDbType.Decimal);
                    parameter.Value = liste.Procent;
                    command.Parameters.Add(parameter);

                    parameter = new SqlParameter("@ForrigeStemmetal", SqlDbType.Int);
                    parameter.Value = liste.ForrigeStemmeTal;
                    command.Parameters.Add(parameter);

                    parameter = new SqlParameter("@ForrigeProcent", SqlDbType.Decimal);
                    parameter.Value = liste.ForrigeProcent;
                    command.Parameters.Add(parameter);

                    parameter = new SqlParameter("@Listestemmer", SqlDbType.Int);
                    parameter.Value = liste.ListeStemmer;
                    command.Parameters.Add(parameter);

                    parameter = new SqlParameter("@ListeID", SqlDbType.Int);
                    parameter.Direction = ParameterDirection.Output;
                    command.Parameters.Add(parameter);

                    
                    parameter = new SqlParameter("@valgnummer", SqlDbType.Int);
                    parameter.Value = valgnummer;
                    command.Parameters.Add(parameter);

                    command.ExecuteNonQuery();
                    listeid = (int)command.Parameters["@ListeID"].Value;

                    break;

                case "kreds":
                    command = new SqlCommand("SP_KredsListe", sqlCon);
                    command.CommandType = CommandType.StoredProcedure;
                    Kreds kreds = (Kreds)input;

                    command.Parameters.Clear();

                    parameter = new SqlParameter("@GAID", SqlDbType.Int);
                    parameter.Value = kreds.AmtstorkredsID;
                    command.Parameters.Add(parameter);

                    parameter = new SqlParameter("@GVID", SqlDbType.Int);
                    parameter.Value = kreds.KredsID;
                    command.Parameters.Add(parameter);

                    parameter = new SqlParameter("@Valgfase", SqlDbType.Int);
                    parameter.Value = kreds.Valgfase;
                    command.Parameters.Add(parameter);

                    parameter = new SqlParameter("@Bogstav", SqlDbType.NVarChar);
                    parameter.Value = liste.Bogstav;
                    command.Parameters.Add(parameter);

                    parameter = new SqlParameter("@Navn", SqlDbType.NVarChar);
                    parameter.Value = liste.Navn;
                    command.Parameters.Add(parameter);

                    parameter = new SqlParameter("@Stemmetal", SqlDbType.Int);
                    parameter.Value = liste.Stemmetal;
                    command.Parameters.Add(parameter);

                    parameter = new SqlParameter("@Procent", SqlDbType.Decimal);
                    parameter.Value = liste.Procent;
                    command.Parameters.Add(parameter);

                    parameter = new SqlParameter("@ForrigeStemmetal", SqlDbType.Int);
                    parameter.Value = liste.ForrigeStemmeTal;
                    command.Parameters.Add(parameter);

                    parameter = new SqlParameter("@ForrigeProcent", SqlDbType.Decimal);
                    parameter.Value = liste.ForrigeProcent;
                    command.Parameters.Add(parameter);

                    parameter = new SqlParameter("@Listestemmer", SqlDbType.Int);
                    parameter.Value = liste.ListeStemmer;
                    command.Parameters.Add(parameter);

                    parameter = new SqlParameter("@ListeID", SqlDbType.Int);
                    parameter.Direction = ParameterDirection.Output;
                    command.Parameters.Add(parameter);

                    
                    parameter = new SqlParameter("@valgnummer", SqlDbType.Int);
                    parameter.Value = valgnummer;
                    command.Parameters.Add(parameter);

                    command.ExecuteNonQuery();
                    listeid = (int)command.Parameters["@ListeID"].Value;

                    break;
            }
            return listeid;
        }

        /// <summary>
        /// Lavet af Søren - lægger en kandidat i databasen, tager højde for hvilken valgtype det er 
        /// og lægger ud fra det det rigtige data i databasen.
        /// </summary>
        /// <param name="kandidat"></param>
        /// <param name="valgtype"></param>
        /// <param name="listeid"></param>
        /// <param name="sqlCon"></param>
        /// <param name="valgnummer"></param>
        private void SPKandidat(IKandidat kandidat, string valgtype, int? listeid, SqlConnection sqlCon, int valgnummer)
        {
            SqlCommand command = null;

            switch (valgtype)
            {
                case "kommune":
                    command = new SqlCommand("SP_KomKandidat", sqlCon);

                    break;

                case "afstemningsområde":
                    command = new SqlCommand("SP_AOKandidat", sqlCon);
                    break;

                case "kreds":
                    command = new SqlCommand("SP_KredsKandidat", sqlCon);
                    break;
            }

            if (command != null)
            {

                SqlParameter parameter;

                parameter = new SqlParameter("@Navn", SqlDbType.NVarChar);
                parameter.Value = kandidat.Navn;
                command.Parameters.Add(parameter);

                parameter = new SqlParameter("@Stemmetal", SqlDbType.Int);
                parameter.Value = kandidat.Stemmetal;
                command.Parameters.Add(parameter);

                parameter = new SqlParameter("@ListeID", SqlDbType.Int);
                parameter.Value = listeid;
                command.Parameters.Add(parameter);

                parameter = new SqlParameter("@valgnummer", SqlDbType.Int);
                parameter.Value = valgnummer;
                command.Parameters.Add(parameter);

                command.CommandType = CommandType.StoredProcedure;
                command.ExecuteNonQuery();
            }
        }

        /// <summary>
        /// Lavet af Søren - kald denne metode for at lægge i databasen. Denne metode finder ud af hvad for en valgtype
        /// valgdataen er fra og lægger derefter dataen rigtigt i databasen.
        /// </summary>
        /// <param name="trans"></param>
        /// <param name="sqlCon"></param>
        /// <param name="valgnummer"></param>
        public void UploadTilDatabase(Transport trans, SqlConnection sqlCon, int valgnummer)
        {
            foreach (var item in trans.ValgData)
            {
                string valgtype = item.Type;

                switch (valgtype)
                {
                    case "kommune":
                        Kommune tempKommune = (Kommune)item;
                        SP_Kommune(tempKommune,sqlCon,valgnummer);
                        break;

                    case "afstemningsområde":
                        Afstemningsområde tempAO = (Afstemningsområde)item;
                        SP_Afstemningsområde(tempAO, sqlCon,valgnummer);
                        break;

                    case "kreds":
                        Kreds tempKreds = (Kreds)item;
                        SP_Kreds(tempKreds, sqlCon,valgnummer);
                        break;
                }


            }

        } 
        #endregion

        #region Manuel SP

        /// <summary>
        /// Lavet af Rasmus
        /// </summary>
        /// <param name="trans"></param>
        /// <param name="sqlCon"></param>
        public void SP_Manuel_Tilføje(Transport trans, SqlConnection sqlCon)
        {
            SqlCommand command = new SqlCommand("SP_Manuel_Tilføje", sqlCon);
            command.CommandType = CommandType.StoredProcedure;
            SqlParameter parameter;

            parameter = new SqlParameter("@xmlFil", SqlDbType.Xml);
            parameter.Value = new SqlXml(XmlReader.Create(new StringReader(trans.Document.OuterXml)));
            command.Parameters.Add(parameter);

            parameter = new SqlParameter("@regel", SqlDbType.Bit);
            parameter.Value = trans.Regel;
            command.Parameters.Add(parameter);

            parameter = new SqlParameter("@filnavn", SqlDbType.NVarChar);
            parameter.Value = trans.Filnavn;
            command.Parameters.Add(parameter);

            command.ExecuteNonQuery();
        }

        /// <summary>
        /// Lavet af Rasmus
        /// </summary>
        /// <param name="sqlCon"></param>
        /// <returns></returns>
        public Dictionary<XmlDocument, string> SP_Manuel_Udtræk(SqlConnection sqlCon)
        {
            Dictionary<XmlDocument, string> retVal = new Dictionary<XmlDocument, string>();
            SqlCommand command = new SqlCommand("SP_Manuel_Udtræk", sqlCon);
            command.CommandType = CommandType.StoredProcedure;
            SqlParameter parameter;

            parameter = new SqlParameter("@xmlFil", SqlDbType.Xml);
            parameter.Direction = ParameterDirection.Output;
            command.Parameters.Add(parameter);

            parameter = new SqlParameter("@filnavn", SqlDbType.NVarChar, 150);
            parameter.Direction = ParameterDirection.Output;
            command.Parameters.Add(parameter);

            command.ExecuteNonQuery();

            XmlDocument doc = new XmlDocument();
            SqlXml xml = (SqlXml)command.Parameters["@xmlfil"].SqlValue;



            doc.LoadXml(xml.Value);
            string filnavn = command.Parameters["@filnavn"].Value.ToString();
            
            
            retVal.Add(doc, filnavn);
            return retVal;

        }

        /// <summary>
        /// Lavet af Rasmus
        /// </summary>
        /// <param name="sqlCon"></param>
        /// <returns></returns>
        public int SP_Manuel_Antal(SqlConnection sqlCon)
        {

            int retVal = 0;
            SqlCommand sqlComm = new SqlCommand();
            sqlComm.CommandType = CommandType.StoredProcedure;
            sqlComm.CommandText = "SP_Manuel_Antal";
            sqlComm.Connection = sqlCon;

            SqlParameter par = new SqlParameter("@output", SqlDbType.Int);
            par.Direction = ParameterDirection.Output;
            sqlComm.Parameters.Add(par);

            sqlComm.ExecuteNonQuery();

            retVal = int.Parse(sqlComm.Parameters["@output"].Value.ToString());
            return retVal;
        }

        /// <summary>
        /// Lavet af Rasmus
        /// </summary>
        /// <param name="stedId"></param>
        /// <param name="gkId"></param>
        /// <param name="sqlCon"></param>
        /// <returns></returns>
        public string SP_Manuel_GeoData_AO(int stedId, int gkId, SqlConnection sqlCon)
        {
            SqlDataReader reader;
            SqlCommand sqlComm = new SqlCommand();
            sqlComm.CommandType = CommandType.StoredProcedure;
            sqlComm.CommandText = "SP_Manuel_GeoData_AO";
            sqlComm.Connection = sqlCon;

            SqlParameter par = new SqlParameter("@StedId", SqlDbType.Int);
            par.Value = stedId;
            sqlComm.Parameters.Add(par);

            par = new SqlParameter("@GKID", SqlDbType.Int);
            par.Value = gkId;
            sqlComm.Parameters.Add(par);

            reader = sqlComm.ExecuteReader();
            string retVal = "";
            while (reader.Read())
            {
                retVal = reader["Navn"] + "\r\n" + reader["Adresselinje1"] + "\r\n" + reader["Adresselinje2"] + "\r\n" + reader["Adresselinje3"];
            }

            return retVal;
        }

        /// <summary>
        /// Lavet af Rasmus
        /// </summary>
        /// <param name="gkId"></param>
        /// <param name="sqlCon"></param>
        /// <returns></returns>
        public string SP_Manuel_GeoData_Kommune(int gkId, SqlConnection sqlCon)
        {
            SqlDataReader reader;
            SqlCommand sqlComm = new SqlCommand();
            sqlComm.CommandType = CommandType.StoredProcedure;
            sqlComm.CommandText = "SP_Manuel_GeoData_Kommune";
            sqlComm.Connection = sqlCon;

            SqlParameter par = new SqlParameter("@GKID", SqlDbType.Int);
            par.Value = gkId;
            sqlComm.Parameters.Add(par);

            reader = sqlComm.ExecuteReader();
            string retVal = "";
            while (reader.Read())
            {
                retVal = reader["Navn"].ToString();
            }

            return retVal;
        }

        /// <summary>
        /// Lavet af Rasmus
        /// </summary>
        /// <param name="gvId"></param>
        /// <param name="sqlCon"></param>
        /// <returns></returns>
        public string SP_Manuel_GeoData_Kreds(int gvId, SqlConnection sqlCon)
        {
            SqlDataReader reader;
            SqlCommand sqlComm = new SqlCommand();
            sqlComm.CommandType = CommandType.StoredProcedure;
            sqlComm.CommandText = "SP_Manuel_GeoData_Kreds";
            sqlComm.Connection = sqlCon;

            SqlParameter par = new SqlParameter("@GVID", SqlDbType.Int);
            par.Value = gvId;
            sqlComm.Parameters.Add(par);

            reader = sqlComm.ExecuteReader();
            string retVal = "";
            while (reader.Read())
            {
                retVal = reader["Navn"].ToString();
            }

            return retVal;
        }

        /// <summary>
        /// Lavet af Rasmus
        /// </summary>
        /// <param name="gaId"></param>
        /// <param name="sqlCon"></param>
        /// <returns></returns>
        public string SP_Manuel_GeoData_Amtstorkreds(int gaId, SqlConnection sqlCon)
        {
            SqlDataReader reader;
            SqlCommand sqlComm = new SqlCommand();
            sqlComm.CommandType = CommandType.StoredProcedure;
            sqlComm.CommandText = "SP_Manuel_GeoData_Amtstorkreds";
            sqlComm.Connection = sqlCon;

            SqlParameter par = new SqlParameter("@GAID", SqlDbType.Int);
            par.Value = gaId;
            sqlComm.Parameters.Add(par);

            reader = sqlComm.ExecuteReader();
            string retVal = "";
            while (reader.Read())
            {
                retVal = reader["Navn"].ToString();
            }

            return retVal;
        }

        /// <summary>
        /// Lavet af Rasmus
        /// </summary>
        /// <param name="trans"></param>
        /// <param name="sqlCon"></param>
        public void SP_KasseretXML(Transport trans, SqlConnection sqlCon)
        {
            SqlCommand command = new SqlCommand("SP_KasseretXML", sqlCon);
            command.CommandType = CommandType.StoredProcedure;
            SqlParameter parameter;

            parameter = new SqlParameter("@xmlDoc", SqlDbType.Xml);
            parameter.Value = trans.Document;
            command.Parameters.Add(parameter);

            command.ExecuteNonQuery();
        }
        #endregion

        /// <summary>
        /// Lavet af Rasmus - Henter valgresultater fra dataen, som så kan vises i fx et diagram.
        /// </summary>
        /// <param name="sqlCon"></param>
        /// <param name="valgnummer"></param>
        /// <returns></returns>
        public Dictionary<string, int> HentResultat(SqlConnection sqlCon, int valgnummer)
        {
            SqlCommand sqlComm = new SqlCommand();
            sqlComm.Connection = sqlCon;
            sqlComm.CommandType = CommandType.Text;
            sqlComm.CommandText = "SELECT SUM(DISTINCT STEMMETAL) AS STEMMETAL, Navn From KredsListe WHERE ValgFase = 4 AND ValgNummer ="+valgnummer+" GROUP BY Navn HAVING SUM(Distinct Stemmetal) > 300";
            Dictionary<string, int> retVal = new Dictionary<string, int>();
            SqlDataReader reader = sqlComm.ExecuteReader();
            while (reader.Read())
            {
                retVal.Add(reader["Navn"].ToString(), int.Parse(reader["Stemmetal"].ToString()));
            }

            return retVal;
            
        }

        /// <summary>
        /// Lavet af Rasmus
        /// </summary>
        /// <param name="sqlCon"></param>
        /// <returns></returns>
        public int NytValg(SqlConnection sqlCon)
        {
            SqlCommand sqlComm = new SqlCommand();
            sqlComm.Connection = sqlCon;
            sqlComm.CommandType = CommandType.StoredProcedure;
            sqlComm.CommandText = "ValgNummer";

            SqlParameter par = new SqlParameter("@Timestamp", SqlDbType.DateTime);
            par.Value = DateTime.Now;
            sqlComm.Parameters.Add(par);

            par = new SqlParameter("@valgnummer", SqlDbType.Int);
            par.Direction = ParameterDirection.Output;
            sqlComm.Parameters.Add(par);

            sqlComm.ExecuteNonQuery();
            SP_XML_Nulstil(sqlCon);
            return int.Parse(sqlComm.Parameters["@valgnummer"].Value.ToString());
        }
    }
}